package org.ssssssss.magicapi.socket;

import java.nio.ByteBuffer;
import java.util.HashMap;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.ssssssss.magicapi.Const;
import org.tio.client.intf.TioClientHandler;
import org.tio.core.ChannelContext;
import org.tio.core.TioConfig;
import org.tio.core.exception.TioDecodeException;
import org.tio.core.intf.Packet;

public class R2rClientHandler implements TioClientHandler {
	private static Logger log = LoggerFactory.getLogger(R2rClientHandler.class);

	private String decodeApi = "";
	private String encodeApi = "";
	private String handlerApi = "";
	
    /**
     * 解码：把接收到的ByteBuffer，解码成应用可以识别的业务消息包
     * 总的消息结构：消息头 + 消息体
     * 消息头结构：    4个字节，存储消息体的长度
     * 消息体结构：   对象的json串的byte[]
     */

    @Override
    public R2rPacket decode(ByteBuffer buffer, int limit, int position, int readableLength, ChannelContext channelContext) throws TioDecodeException {
        if(readableLength>0) {
	    	Map<String,Object> params = new HashMap<>();
	        params.put("buffer",buffer);
	        params.put("limit",limit);
	        params.put("position",position);
	        params.put("readableLength",readableLength);
	        params.put("channelContext",channelContext);
	        return Const.getService().execute("POST",decodeApi, params);        	
        }
        return null;
    }
    /**
     * 编码：把业务消息包编码为可以发送的ByteBuffer
     * 总的消息结构：消息头 + 消息体
     * 消息头结构：    4个字节，存储消息体的长度
     * 消息体结构：   对象的json串的byte[]
     */
    @Override
    public ByteBuffer encode(Packet packet, TioConfig tioConfig, ChannelContext channelContext) {
        Map<String,Object> params = new HashMap<>();
        params.put("packet",(R2rPacket)packet);
        params.put("channelContext",channelContext);
        ByteBuffer buffer = Const.getService().execute("POST",encodeApi, params);
        return buffer;
    }
    /**
     * 处理消息
     */
    @Override
    public void handler(Packet packet, ChannelContext channelContext) throws Exception {
        Map<String,Object> params = new HashMap<>();
        params.put("packet",(R2rPacket) packet);
        Const.getService().execute("POST",handlerApi, params);
    }
    /**
     * 此方法如果返回null，框架层面则不会发心跳；如果返回非null，框架层面会定时发本方法返回的消息包
     */


    @Override
    public R2rPacket heartbeatPacket(ChannelContext channelContext) {
        return null;
    }

    /*
     * 设置magic-api接口
     */
    public void setApi(String decodeApi,String encodeApi,String handlerApi) {
    	this.decodeApi = decodeApi;
    	this.encodeApi = encodeApi;
    	this.handlerApi = handlerApi;
    }
    
}

